#include "Object.h"

//void CreatePyramid()
//{
//	vector pos;
//	color  col;
//
//	SetVertexCount(18);
//
//	// front
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 0.0f;
//	pos.x = 0.0f; pos.y = 1.0f; pos.z = 0.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	// right
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 0.0f;
//	pos.x = 0.0f; pos.y = 1.0f; pos.z = 0.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	// back
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 0.0f;
//	pos.x = 0.0f; pos.y = 1.0f; pos.z = 0.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	// left
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 0.0f;
//	pos.x = 0.0f; pos.y = 1.0f; pos.z = 0.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	// bottom
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//}

//void CreateCube()
//{
//	vector pos;
//	color  col;
//
//	SetVertexCount(36);
//
//	// top
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 0.0f;
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	// bottom
//
//	col.r = 0.0f; col.g = 1.0f; col.b = 1.0f;
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	// front
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 0.0f;
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	// back
//
//	col.r = 1.0f; col.g = 1.0f; col.b = 0.0f;
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	// left
//
//	col.r = 0.0f; col.g = 0.0f; col.b = 1.0f;
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = -1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	// right
//
//	col.r = 1.0f; col.g = 0.0f; col.b = 1.0f;
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = 1.0f; pos.z = -1.0f;
//	AddVertex( pos, col );
//
//	pos.x = 1.0f; pos.y = -1.0f; pos.z = 1.0f;
//	AddVertex( pos, col );
//}

//void CreatePlane( float_t minx, float_t miny, float_t maxx, float_t maxy, float_t z, int_t subx, int_t suby )
//{
	// TODO: this is very likely not wound correctly, and probably broken anyway

	//float_t sizex = (maxx - minx) / subx;
	//float_t sizey = (maxy - miny) / suby;

	//vertex vert;
	//vert.z = z;
	//for( int_t x = 0; x < subx - 1; ++x )
	//{
	//	for( int_t y = 0; y < suby - 1; ++y )
	//	{
	//		vert.x = minx + x * sizex;
	//		vert.y = miny + y * sizey;
	//		m_lstVertices.Append(vert);

	//		vert.x = minx + x * sizex;
	//		vert.y = miny + (y + 1) * sizey;
	//		m_lstVertices.Append(vert);

	//		vert.x = minx + (x + 1) * sizex;
	//		vert.y = miny + y * sizey;
	//		m_lstVertices.Append(vert);

	//		vert.x = minx + (x + 1) * sizex;
	//		vert.y = miny + y * sizey;
	//		m_lstVertices.Append(vert);

	//		vert.x = minx + x * sizex;
	//		vert.y = miny + (y + 1) * sizey;
	//		m_lstVertices.Append(vert);

	//		vert.x = minx + (x + 1) * sizex;
	//		vert.y = miny + (y + 1) * sizey;
	//		m_lstVertices.Append(vert);
	//	}
	//}
//}

//void NormalizeVector3( float_t fVector[3] )
//{
//	float_t fLength = sqrt( fVector[1] * fVector[1] + fVector[2] * fVector[2] + fVector[3] * fVector[3] );
//	fVector[1] /= fLength;
//	fVector[2] /= fLength;
//	fVector[3] /= fLength;
//}

//void CreateTorus( float_t majorRadius, float_t minorRadius, int_t numMajor, int_t numMinor )
//{
//	float64_t majorStep = 2.0f*CE_PI / numMajor;
//	float64_t minorStep = 2.0f*CE_PI / numMinor;
//	int_t i, j;
//
//	for (i=0; i<numMajor; ++i) 
//	{
//		float64_t a0 = i * majorStep;
//		float64_t a1 = a0 + majorStep;
//		float_t x0 = (float_t) cos(a0);
//		float_t y0 = (float_t) sin(a0);
//		float_t x1 = (float_t) cos(a1);
//		float_t y1 = (float_t) sin(a1);
//
//		float_t vVertex[4][3];
//		float_t vNormal[4][3];
//		float_t vTexture[4][2];
//
//		for (j=0; j<=numMinor; ++j) 
//		{
//			float64_t b = j * minorStep;
//			float_t c = (float_t) cos(b);
//			float_t r = minorRadius * c + majorRadius;
//			float_t z = minorRadius * (float_t) sin(b);
//
//			// First point
//			vTexture[0][0] = (float_t)(i)/(float_t)(numMajor);
//			vTexture[0][1] = (float_t)(j)/(float_t)(numMinor);
//			vNormal[0][0] = x0*c;
//			vNormal[0][1] = y0*c;
//			vNormal[0][2] = z/minorRadius;
//			NormalizeVector3(vNormal[0]);
//			vVertex[0][0] = x0 * r;
//			vVertex[0][1] = y0 * r;
//			vVertex[0][2] = z;
//
//			// Second point
//			vTexture[1][0] = (float_t)(i+1)/(float_t)(numMajor);
//			vTexture[1][1] = (float_t)(j)/(float_t)(numMinor);
//			vNormal[1][0] = x1*c;
//			vNormal[1][1] = y1*c;
//			vNormal[1][2] = z/minorRadius;
//			NormalizeVector3(vNormal[1]);
//			vVertex[1][0] = x1*r;
//			vVertex[1][1] = y1*r;
//			vVertex[1][2] = z;
//
//			// Next one over
//			b = (j+1) * minorStep;
//			c = (float_t) cos(b);
//			r = minorRadius * c + majorRadius;
//			z = minorRadius * (float_t) sin(b);
//
//			// Third (based on first)
//			vTexture[2][0] = (float_t)(i)/(float_t)(numMajor);
//			vTexture[2][1] = (float_t)(j+1)/(float_t)(numMinor);
//			vNormal[2][0] = x0*c;
//			vNormal[2][1] = y0*c;
//			vNormal[2][2] = z/minorRadius;
//			NormalizeVector3(vNormal[2]);
//			vVertex[2][0] = x0 * r;
//			vVertex[2][1] = y0 * r;
//			vVertex[2][2] = z;
//
//			// Fourth (based on second)
//			vTexture[3][0] = (float_t)(i+1)/(float_t)(numMajor);
//			vTexture[3][1] = (float_t)(j+1)/(float_t)(numMinor);
//			vNormal[3][0] = x1*c;
//			vNormal[3][1] = y1*c;
//			vNormal[3][2] = z/minorRadius;
//			NormalizeVector3(vNormal[3]);
//			vVertex[3][0] = x1*r;
//			vVertex[3][1] = y1*r;
//			vVertex[3][2] = z;
//
//			AddTriangle(vVertex, vNormal, vTexture);			
//
//			// Rearrange for next triangle
//			memcpy(vVertex[0], vVertex[1], sizeof(float_t[3]));
//			memcpy(vNormal[0], vNormal[1], sizeof(float_t[3]));
//			memcpy(vTexture[0], vTexture[1], sizeof(float_t[2]));
//
//			memcpy(vVertex[1], vVertex[3], sizeof(float_t[3]));
//			memcpy(vNormal[1], vNormal[3], sizeof(float_t[3]));
//			memcpy(vTexture[1], vTexture[3], sizeof(float_t[2]));
//
//			AddTriangle(vVertex, vNormal, vTexture);			
//		}
//	}
//}

//void CreateSphere( float_t fRadius, int_t iSlices, int_t iStacks )
//{
//	float_t drho = (float_t)(3.141592653589) / (float_t) iStacks;
//	float_t dtheta = 2.0f * (float_t)(3.141592653589) / (float_t) iSlices;
//	float_t ds = 1.0f / (float_t) iSlices;
//	float_t dt = 1.0f / (float_t) iStacks;
//	float_t t = 1.0f;	
//	float_t s = 0.0f;
//	int_t i, j;     // Looping variables
//
//	for (i = 0; i < iStacks; i++) 
//	{
//		float_t rho = (float_t)i * drho;
//		float_t srho = (float_t)(sin(rho));
//		float_t crho = (float_t)(cos(rho));
//		float_t srhodrho = (float_t)(sin(rho + drho));
//		float_t crhodrho = (float_t)(cos(rho + drho));
//
//		// Many sources of OpenGL sphere drawing code uses a triangle fan
//		// for the caps of the sphere. This however introduces texturing 
//		// artifacts at the poles on some OpenGL implementations
//		s = 0.0f;
//		float_t vVertex[4][3];
//		float_t vNormal[4][3];
//		float_t vTexture[4][2];
//
//		for ( j = 0; j < iSlices; j++) 
//		{
//			float_t theta = (j == iSlices) ? 0.0f : j * dtheta;
//			float_t stheta = (float_t)(-sin(theta));
//			float_t ctheta = (float_t)(cos(theta));
//
//			float_t x = stheta * srho;
//			float_t y = ctheta * srho;
//			float_t z = crho;
//
//			vTexture[0][0] = s;
//			vTexture[0][1] = t;
//			vNormal[0][0] = x;
//			vNormal[0][1] = y;
//			vNormal[0][2] = z;
//			vVertex[0][0] = x * fRadius;
//			vVertex[0][1] = y * fRadius;
//			vVertex[0][2] = z * fRadius;
//
//			x = stheta * srhodrho;
//			y = ctheta * srhodrho;
//			z = crhodrho;
//
//			vTexture[1][0] = s;
//			vTexture[1][1] = t - dt;
//			vNormal[1][0] = x;
//			vNormal[1][1] = y;
//			vNormal[1][2] = z;
//			vVertex[1][0] = x * fRadius;
//			vVertex[1][1] = y * fRadius;
//			vVertex[1][2] = z * fRadius;
//
//
//			theta = ((j+1) == iSlices) ? 0.0f : (j+1) * dtheta;
//			stheta = (float_t)(-sin(theta));
//			ctheta = (float_t)(cos(theta));
//
//			x = stheta * srho;
//			y = ctheta * srho;
//			z = crho;
//
//			s += ds;
//			vTexture[2][0] = s;
//			vTexture[2][1] = t;
//			vNormal[2][0] = x;
//			vNormal[2][1] = y;
//			vNormal[2][2] = z;
//			vVertex[2][0] = x * fRadius;
//			vVertex[2][1] = y * fRadius;
//			vVertex[2][2] = z * fRadius;
//
//			x = stheta * srhodrho;
//			y = ctheta * srhodrho;
//			z = crhodrho;
//
//			vTexture[3][0] = s;
//			vTexture[3][1] = t - dt;
//			vNormal[3][0] = x;
//			vNormal[3][1] = y;
//			vNormal[3][2] = z;
//			vVertex[3][0] = x * fRadius;
//			vVertex[3][1] = y * fRadius;
//			vVertex[3][2] = z * fRadius;
//
//			AddTriangle(vVertex, vNormal, vTexture);			
//
//			// Rearrange for next triangle
//			memcpy(vVertex[0], vVertex[1], sizeof(float_t[3]));
//			memcpy(vNormal[0], vNormal[1], sizeof(float_t[3]));
//			memcpy(vTexture[0], vTexture[1], sizeof(float_t[2]));
//
//			memcpy(vVertex[1], vVertex[3], sizeof(float_t[3]));
//			memcpy(vNormal[1], vNormal[3], sizeof(float_t[3]));
//			memcpy(vTexture[1], vTexture[3], sizeof(float_t[2]));
//
//			AddTriangle(vVertex, vNormal, vTexture);			
//		}
//		t -= dt;
//	}
//}
